package
{
	import flash.display.Shape;
	import flash.events.Event;
	
	/**
	 * Balle
	 * @author Jean-Marie PETIT@hsh
	 */
	public class Balle extends Shape
	{
		private var _raq:Raquette;
		private var _mur:Mur;
		
		private var _lbal:Number = 14;	// largeur de la balle
		private var _mBal:Number = _lbal / 2;		// milieu balle
		private var _lraq:Number;		// largeur de la raquette
		private var _lmur:int;			// largeur du mur
		private var _hmur:int;			// hauteur du mur
		
		private var _vHor:Number = 0; 	// déplacement horizontal
		private var _vVer:Number = -7; 	// déplacement vertical
		private var _vit:Number = 7; 	// vitesse de déplacement

		public function Balle(mur:Mur, px:int, py:int)
		{
			_mur = mur;
			_lmur = _mur.lg - 10;
			_hmur = _mur.ht + 40;
			_mur.addChild(this);
			
			_raq = mur.raquette;
			_lraq = _raq.lg;
 
			x = px;
			y = py;
			new Degrade(graphics, _lbal, _lbal, _lbal, [0xFFFFFF, 0xFFFF00, 0xFF0000], [1, 1, 1], [0, 128, 255], 45);
		}
		
		public function lancer():void
		{
			addEventListener(Event.ENTER_FRAME, _deplacer);
		}
		
		public function arreter():void
		{
			removeEventListener(Event.ENTER_FRAME, _deplacer);
			parent.removeChild(this);
		}
		
		private function _deplacer(e:Event):void
		{			
			if (hitTestObject(_raq))
			{ 	
				// position sur la raquette, entre -1 et + 1
				var pos:Number = 2 * (((x + _mBal) - _raq.x) / _lraq) -1;
				_vHor =  _vit * Math.sin( pos ) ;
				_vVer =  -_vit * Math.cos( pos );
			}
			x += _vHor; // décaler horizontalement
			y += _vVer; // décaler verticalement
		}
		
		private function rebond():void
		{
			// Calcul de l'angle du rebond, décomposé :
			
			// position sur la raquette, entre -1 et +1
			var pourcent:Number = pct(_raq.x, _raq.x + _lraq, x + _mBal);
			var position:Number = pval( -1, 1, pourcent);
			
			// calcule la valeur correspondant à un pourcentage
			function pval(min:Number, max:Number,pct:Number):Number
			{
				return ((max - min) * pct) + min;
			}
			// calcule un pourcentage
			function pct (min:Number, max:Number, val:Number):Number 
			{
				return (val - min) / (max - min);
			}			
		}
		private function _testerCollision():void
		{
			var b:Brique
			for each (b in _mur.briques)
			{
				if (hitTestObject(b))
				{
					b.exploser();
					_vit += 0.1;
					_vVer = -_vVer;
					break;
				}
			}
		}
		
		public function get vites():String
		{
			return _vit.toFixed(2);
		}
		
		override public function set x(value:Number):void
		{
			super.x = Math.max(10, Math.min(_lmur, value));
			if (value < 10 || value > _lmur)
			{
				_vHor = -_vHor;
				_vit += 0.1;
			}
		}
		
		override public function set y(value:Number):void
		{
			super.y = Math.max(10, Math.min(_hmur, value));
			if (value < 10)
			{
				_vVer = -_vVer;
				_vit += 0.1;
			}
			_testerCollision();
			if (value > _hmur - 10)
			{
				arreter();
				_mur.balleNeuve();
			}
		}
	}
}